/**
 * 在 TypeScript 拥有非常强大的类型推导能力：
 * 一、TS中的推导依赖 开发者的输入，比如变量声明、函数逻辑、类型保护都需要开发者的输入
 * 二、就是 上下文类型（Contextual Typing）
*/

/**
 * 上下文类型
 * 例如：并没有为函数 handler 的各个参数声明类型，但是它们也已经获得了正确的类型
 * 这就是上下文类型的核心理念：基于位置的类型推导
 * 上下文类型更像是反方向的类型推导，也就是基于已定义的类型来规范开发者的使用
 * 
 * 在上下文类型中，实现的表达式只可以使用更少的参数，而不能使用更多，
 * 这还是因为上下文类型基于位置的匹配，一旦参数个数超过定义的数量，那就没法进行匹配了。
*/
type CustomHandler = (name: string, age: number) => boolean;
// 也推导出了参数类型
const handler: CustomHandler = (arg1, arg2) => true;

/**
 * 上下文类型也可以进行”嵌套“情况下的类型推导
*/
declare let func: (raw: number) => (input: string) => any;
// raw → number
func = (raw) => {
    // input → string
    return (input) => { };
};

/**
 * 使用一个 联合类型参数 的函数签名
*/
class Foo {
    foo!: number;
}
class Bar extends Foo {
    bar!: number;
}
let f2: { (input: Foo | Bar): void };
// Foo | Bar
f2 = (input) => {};



//export {}：解决“无法重新声明块范围变量”错误提示问题
export { }